package com.xiao.singleapp.dao.impl;

import com.xiao.singleapp.dao.GenCodeDao;
import com.xiao.singleapp.utils.JdbcTemplate;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * mysql 数据库
 *
 * @CreateBy 花和尚  1130365579@qq.com  2023/3/19 16:11
 * @Version 1.0
 */
public class MysqlGenCodeDaoImpl implements GenCodeDao {

    /**
     * 获得当前连接的数据库下的所有的表信息
     * 数据结构如下 一个map 代表一张表
     * Map 包含的key 有 tableName（表名），ENGINE（存储引擎），tableComment（表实体说明），createTime（表创建的时间）
     *
     * @return
     */
    @Override
    public List<Map<String, String>> list() {
        List<Map<String, String>> resultList = null;
        String sql = "SELECT table_name    as tableName,\n" +
                "       ENGINE        as ENGINE,\n" +
                "       table_comment as tableComment,\n" +
                "       create_time   as createTime\n" +
                "FROM information_schema.TABLES\n" +
                "WHERE table_schema = (\n" +
                "    SELECT DATABASE());";
        try {
            resultList = JdbcTemplate.queryResultToListMap(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return resultList;
    }

    /**
     * 获得指定表的信息
     * 数据结构如下 一个map 代表一张表 指定表名 list 内只会有一个Map 对象
     * Map 包含的key 有 tableName（表名），ENGINE（存储引擎），tableComment（表实体说明），createTime（表创建的时间）
     *
     * @param tableName 表名
     * @return
     */
    @Override
    public Map<String, String> listByTableName(String tableName) {
        List<Map<String, String>> resultList = null;
        String sql = "SELECT table_name    as tableName,\n" +
                "       ENGINE        as ENGINE,\n" +
                "       table_comment as tableComment,\n" +
                "       create_time   as createTime\n" +
                "FROM information_schema.TABLES\n" +
                "WHERE table_schema = (SELECT DATABASE())\n" +
                "  AND table_name = '" + tableName + "';";
        try {
            resultList = JdbcTemplate.queryResultToListMap(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        assert resultList != null;
        return resultList.get(0);
    }

    /**
     * 获得表的所有字段
     * 数据结构如下
     * 一个字段一个Map
     * Map 包含的 key 有：
     * columnName（字段名）
     * dataType（数据库字段声明类型）
     * columnComment （字段说明）
     * columnKey（字段key）
     * extra（字段额外声明）
     * column_type （字段数据类型完整声明 包含长度）
     *
     * @param tableName 表名
     * @return
     */
    @Override
    public List<Map<String, String>> listColumns(String tableName) {
        List<Map<String, String>> resultList = null;
        String sql = "SELECT column_name    as columnName,\n" +
                "       data_type      as dataType,\n" +
                "       column_comment as columnComment,\n" +
                "       column_key     as columnKey,\n" +
                "       extra          as extra,\n" +
                "       column_type    as columnType\n" +
                "FROM information_schema.COLUMNS\n" +
                "WHERE table_schema = (SELECT DATABASE())\n" +
                "  AND table_name = '" + tableName + "'\n" +
                "ORDER BY ordinal_position;";
        try {
            resultList = JdbcTemplate.queryResultToListMap(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return resultList;
    }
}
